/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package figuras;

import exceptions.ExcecaoDeMedida;
import interfaces.FiguraGeometrica;

/**
 *
 * @author Thiago
 */
public class Triangulo implements FiguraGeometrica {

    private void checkMedida(int lado) throws ExcecaoDeMedida {
        if(lado < 1)
            throw new ExcecaoDeMedida();
    }

    private void verificaTipo() {
        if(ladoA == ladoB && ladoA == ladoC)
            setTipo(tipoTriangulo.EQUILATERO);
        else if(ladoA != ladoB && ladoB != ladoC && ladoA != ladoC)
            setTipo(tipoTriangulo.ESCALENO);
        else
            setTipo(tipoTriangulo.ISOSCELES);
    }

    public enum tipoTriangulo { ISOSCELES, EQUILATERO, ESCALENO, NENHUM };
    
    private int ladoA;
    private int ladoB;
    private int ladoC;
    private tipoTriangulo tipo = tipoTriangulo.NENHUM;
    
    public Triangulo(int ladoA, int ladoB, int ladoC) throws ExcecaoDeMedida {
        setLadoA(ladoA);
        setLadoB(ladoB);
        setLadoC(ladoC);
        
        if(!isPossible())
            throw new ExcecaoDeMedida("Medidas não são possíveis para um triângulo");
        
        verificaTipo();
    }

    public void setLadoA(int ladoA) throws ExcecaoDeMedida {
        checkMedida(ladoA);
        this.ladoA = ladoA;
    }

    public void setLadoB(int ladoB) throws ExcecaoDeMedida {
        checkMedida(ladoB);
        this.ladoB = ladoB;
    }

    public void setLadoC(int ladoC) throws ExcecaoDeMedida {
        checkMedida(ladoC);
        this.ladoC = ladoC;
    }

    public int getLadoA() {
        return ladoA;
    }

    public int getLadoB() {
        return ladoB;
    }

    public int getLadoC() {
        return ladoC;
    }

    public void setTipo(tipoTriangulo tipo) {
        this.tipo = tipo;
    }
    
    @Override
    public double perimetro() {
        return getLadoA() + getLadoB() + getLadoC();
    }

    /*
     * Teorema de herão
     */
    @Override
    public double area() {
        double semiPerimetro = perimetro() / 2;
        double areaViaTeoremaDeHerao = Math.sqrt(semiPerimetro * (semiPerimetro - getLadoA()) * (semiPerimetro - getLadoB()) * (semiPerimetro - getLadoC()));
        return areaViaTeoremaDeHerao;
    }
    
    /*
     * Wikipedia
     * Condição de existência de um triângulo
     * 
     * Para que se possa construir um triângulo é necessário que a medida de qualquer um dos lados seja 
     * menor que a soma das medidas dos outros dois e maior que o valor absoluto da diferença entre essas medidas.
     * |b-c| < a < b+c
     */
    public boolean isPossible(){
        return (Math.abs(getLadoB() - getLadoC()) < getLadoA()) && (getLadoA() < (getLadoB() + getLadoC()));
    }
    
    public tipoTriangulo getTipo(){
        return tipo;
    }
    
}